home *** CD-ROM | disk | FTP | other *** search
- {
- >>DOS will automatically close all open files that belong to your
- >>process upon termination. The only way I know of to do it manually,
- >>if you don't know what the actual file variables will be, is to search
- >>your PSP
-
- > I was doing fine until this point, what's a psp?
- PSP stands for Program Segment Prefix. It contains a lot of information
- about your program that is important to DOS. Some of the things it
- contains is the file handle table for open files, the command line tail,
- information carried over from CP/M, an ISR table, a pointer to a copy of
- the master environment, and more.
-
- >for any open file handles, then explicitly call DOS, passing
- >>each file handle number. If nobody has a better suggestion, I could
- >>probably think up some code to do that.
-
- > at least psuedo code would be appreciated..
- Here is some code that will close all of the files that your program
- actually opened. It won't clear the run-time error; you'll have to
- put that code into the exit-proc, or write your own.
-
- { FCLOSALL.PAS
- file close unit
- 12-5-93
- (c) 1993 Brian Pape
-
- This code may be distributed freely. However, I would appreciate it
- if modifications made to the code would be noted with the name of the
- modifier and the date.
-
- This program will demonstrate how to close all open files in
- your program without knowing what the names of the associated
- file variables are. All that you need to do in order to implement
- this code is put the statement USES FCLOSALL in your main program.
-
- When your program ends, whether through a run-time error or through
- normal termination, this procedure will attempt to close all open files
- that were opened by your program. It will not close the standard i/o
- file handles that are maintained by DOS. In fact, the Turbo RTL will
- automatically close the INPUT and OUTPUT standard files in the standard
- exit procedure. The other DOS standard I/O files are StdErr, AUX,
- and PRN.
-
- This code does not clear the ExitCode variable, so if your program is
- terminating with a run-time error, the turbo ExitProc will still
- print the "Runtime Error at xxxx:xxxx" message. If you want to
- prevent this message from occuring, then write another exitproc to
- clear the ExitCode variable in certain cases.
-
- This code requires TP 6.0 or greater since it uses BASM
- }
-
- unit fclosall;
- interface
- implementation
- var
- saveexit:pointer;
-
- procedure close_files_exit_proc; far;
- var
- numhandles : byte;
- hp : ^byte;
- begin
-
- exitproc := saveexit;
-
- { get number of file handles available }
- numhandles := byte(ptr(prefixseg,$32)^);
-
- { get the location of the fht, in case it is moved }
- hp := pointer(ptr(prefixseg,$34)^);
- inc(hp,5);
-
- { skip the first 5 handles because they are standard DOS handles }
- for numhandles := 5 to pred(numhandles) do
- begin
- asm
- mov ah,3eh
- xor bh,bh
- push ds
- lds si,hp
- mov bl,[si]
- cmp bl,0ffh { don't close invalid handle; it will close INPUT }
- je @invalidhandle
- int $21
- @invalidhandle:
- pop ds
- end;
- inc(hp);
- end;
- end;
-
- begin
- saveexit := exitproc;
- exitproc := @close_files_exit_proc;
- end. { FCLOSALL }
-
-
- { tests the FCLOSALL unit }
- program test_fcloseall;
- uses fclosall;
- var
- f : file;
- i : byte;
- begin
- for i := 1 to 16 do
- begin
- assign(f,'a.a');
- rewrite(f);
- end; { for }
- end.
-